﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2012-04-13
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


class IFNodeObject;
typedef FVector< IFNodeObject* > FV_PNODE;


class IFNodeObject : public IFPropObject
{
protected:
    explicit IFNodeObject()
        :IFPropObject(eEP_Default)
        ,nUserData(0)
        ,dwDataPtr(0)
        ,pParent(0)
    {
    }
    virtual~IFNodeObject()
    {
        pParent = 0;
        vChild.clear();
    }

public:
    // 更新节点
    virtual void Update() = 0;

    // 设置用户数据1
    FINLINE void SetUserData(DWORD d)
    {
        nUserData = d;
    }
    // 获取用户数据1
    FINLINE DWORD GetUserData()
    {
        return nUserData;
    }
    // 设置用户数据2
    FINLINE void SetDataPtr(DWORD_PTR d)
    {
        dwDataPtr = d;
    }
    // 获取用户数据2
    FINLINE DWORD_PTR GetDataPtr()
    {
        return dwDataPtr;
    }
    // 设置父节点
    FINLINE void SetParent(IFNodeObject* p)
    {
        pParent = p;
    }
    // 获取父节点
    FINLINE IFNodeObject* GetParent()
    {
        return pParent;
    }
    // 添加子节点
    FINLINE void AddChild(IFNodeObject* p)
    {
        vChild.push_back(p);
    }
    // 添加一组子节点
    FINLINE void AddChild(FV_PNODE& vobj)
    {
        vChild.append(vobj.begin(), vobj.size());
    }
    // 子节点数量
    FINLINE size_t GetChildCount()
    {
        return vChild.size();
    }
    // 获取指定索引的子节点
    FINLINE IFNodeObject* GetChild(size_t idx)
    {
        if (idx >= 0 && idx < vChild.size())
            return vChild[idx];
        return 0;
    }
    // 是否没有任何子节点
    FINLINE bool IsEmptyChild()
    {
        return vChild.empty();
    }
    // 添空所有子节点
    FINLINE void ClearChild()
    {
        vChild.clear();
    }
    // 在本层查询子节点
    FINLINE IFNodeObject* FindChild(DWORD user_data)
    {
        for (size_t i = 0; i < vChild.size(); ++i)
        {
            if (vChild[i]->nUserData == user_data)
                return vChild[i];
        }
        return 0;
    }
    // 在本层和所有子层查询子节点
    FINLINE IFNodeObject* FindDepthChild(DWORD_PTR user_data)
    {
        for (size_t i = 0; i < vChild.size(); ++i)
        {
            if (vChild[i]->nUserData == user_data)
                return vChild[i];
            IFNodeObject* p = vChild[i]->FindDepthChild(user_data);
            if (p)
                return p;
        }
        return 0;
    }

    // 相关标记状态函数
    FDECLARE_PROPERTY(Enable, eEP_Enable)
    FDECLARE_PROPERTY(Visable, eEP_Visable)
    FDECLARE_PROPERTY(NeedUpdate, eEP_NeedUpdate)

protected:
    DWORD nUserData;            // 用户数据1
    DWORD_PTR dwDataPtr;        // 用户数据2
    IFNodeObject* pParent;      // 父节点
    FV_PNODE vChild;            // 子节点列表
};